package org.saxion.aktiehuis.model;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 * Een bestelling
 */
@Entity
@Table(name = "bestelling")
public class Bestelling {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	@OneToOne
	@JoinColumn(name = "klant")
	private Klant klant;

	@ManyToMany(cascade = CascadeType.ALL)
	@JoinTable(name = "product_bestelling", joinColumns = { @JoinColumn(name = "bestelling_id") }, inverseJoinColumns = { @JoinColumn(name = "besteldproduct_id") })
	private Collection<BesteldProduct> producten = new HashSet<BesteldProduct>();

	private Boolean bevestigd;

	public Bestelling() {
		setBevestigd(false);
		// producten = new HashMap<Product ,Integer>();
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}

	/**
	 * 
	 * @return
	 */
	public Klant getKlant() {
		return klant;
	}

	/**
	 * 
	 * @param klant
	 */
	public void setKlant(Klant klant) {
		this.klant = klant;
	}

	/**
	 * Geeft de lijst met bestelde producten terug
	 * @return Lijst met BesteldProducten
	 */
	public Collection<BesteldProduct> getProducten() {
		return producten;
	}
	
	/**
	 * Voegt een product toe aan de producten lijst
	 * @param product Het toe te voegen producten.
	 * @param aantal Het aan van het bestelde product.
	 */
	public void addProduct(Product product, int aantal) {		
		for (BesteldProduct bpro : producten) {
			Product pro1 = bpro.getProduct();
			if (pro1.equals(product)) {
				bpro.setAantal(bpro.getAantal() + aantal);
				return;
			}
		}

		BesteldProduct bp = new BesteldProduct();
		bp.setAantal(aantal);
		bp.setProduct(product);
		producten.add(bp);

	}
	/**
	 * Voegt een <code>BesteldProduct</code> toe aan een lijst.
	 * @param bestelProduct
	 */
	public void addProduct(BesteldProduct bestelProduct) {		
		Product newProduct = bestelProduct.getProduct();
		
		for (BesteldProduct bpro : producten) {
			Product pro1 = bpro.getProduct();
			if (pro1.equals(newProduct)) {
				bpro.setAantal(bpro.getAantal() + bestelProduct.getAantal());
				return;
			}
		}

		producten.add(bestelProduct);

	}
	/**
	 * Verwijderd een product uit de lijst
	 * @param product
	 */
	public void removeProduct(Product product) {
		producten.remove(product);
	}

	/**
	 * @return the bevestigd
	 */
	public Boolean getBevestigd() {
		return bevestigd;
	}

	/**
	 * Het setten van de Booalean Bevestigd
	 * @param bevestigd
	 */
	public void setBevestigd(Boolean bevestigd) {
		this.bevestigd = bevestigd;
	}

}
